package com.ruoyi.finance.aop;


import com.ruoyi.common.core.annotation.MyCache;

import com.ruoyi.finance.service.Redisaaaa;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
 * @Author: tjk
 * @Date: 2025/2/27
 * @Description:处理分布式缓存添加功能
 **/
@Aspect
@Component
@Slf4j
public class MyCacheAop {


    @Resource
    private Redisaaaa redisService;

    /**
     * 定义切点
     */
    @Pointcut("@annotation(myCache)")
    public void pointCut(MyCache myCache) {
    }

    /**
     * 环绕通知
     */

    @Around("pointCut(myCache)")
    public Object around(ProceedingJoinPoint joinPoint, MyCache myCache) {
//        // 获取注解参数
        String key = myCache.key();
//        // 获取注解参数
        int time = myCache.time();
        /**
         * 思路：
         * 1、拼装redis中存缓存的key值
         * 2、看redis中是否存在该key
         * 3、如果存在，直接取出来返回即可，不需要执行目标方法了
         * 4、如果不存在，就执行目标方法，然后将缓存放一份到redis中
         */
        // 获取注解参数
        String methodPath = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName();
        Object result;
        if (redisService.exists(key)) {
//            log.info("访问接口：[{}]，直接从缓存获取数据", methodPath);
            log.info("访问接口：[{}]，直接从缓存获取数据", key);
            return redisService.getCacheList(key);
        }
        try {
            //调用 joinPoint.proceed() 触发目标方法的执行，并将返回值存储在 result 变量中。
            result = joinPoint.proceed();
            //接口异常结果存Redis
            redisService.setCacheObject(key, result, time, TimeUnit.SECONDS);
            log.info("访问接口：[{}]，返回值存入缓存成功", methodPath);
        } catch (Throwable e) {
            log.error("发生异常:{}", e);
            throw new RuntimeException(e);
        }
        return result;
    }
}
